package com.imooc.product.client;


import com.imooc.product.common.DecreaseStockInput;
import com.imooc.product.common.ProductInfoOutput;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

import java.util.List;

/**
 * Feign调用客户端
 * @author steve
 * @date 2020/6/18 11:38
 */
//fallback：如果服务降级则访问指定的方法
@FeignClient(name = "product", fallback = ProductClient.ProductClientFallback.class)
public interface ProductClient {

    /**
     * Feign测试方法
     * @return
     */
    @GetMapping("/msg")
    public String msg();

    /**
     * 获取商品列表（给订单服务用的）
     * @param productIdList
     * @return
     */
    @PostMapping("/product/listForOrder")
    public List<ProductInfoOutput> listForOrder(@RequestBody List<String> productIdList);

    /**
     * 扣减库存
     * @param decreaseStockInputList 对外暴露的参数，相当于cartDTO，可以保护原有参数安全性
     * @return
     */
    @PostMapping("/product/decreaseStock")
    public String decreaseStock(@RequestBody List<DecreaseStockInput> decreaseStockInputList);

    /**
     * 实现服务降级的逻辑方法
     * 注意要添加@Component注解
     */
    @Component
    static class ProductClientFallback implements ProductClient {
        @Override
        public String msg() {
            return null;
        }

        @Override
        public List<ProductInfoOutput> listForOrder(List<String> productIdList) {
            return null;
        }

        @Override
        public String decreaseStock(List<DecreaseStockInput> decreaseStockInputList) {
            return null;
        }
    }
}
